import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void usage() {
		System.out.println("L'usage est le suivant : ");
		System.out.println("    - random nbSommets proba intervalle");
		System.out.println("    - file chemin");
		System.out.println("La probabilité est comprise entre 0 et 1 inclus.");
		System.out.println("L'intervalle s'écrit sous la forme a");
	}

	public static void main(String[] argv) throws Exception{

		if(argv.length == 0 || argv.length > 4) {
			if(argv.length == 0) {
				System.err.println("Trop peu d'arguments...");
				usage();
				throw new Exception("Nombre d'argument(s) invalide !");
			}
			else {
				System.err.println("Trop d'arguments...");
				usage();
				throw new Exception("Nombre d'argument(s) invalide !");
			}
		}
		else {
			String mode = argv[0];

			// Cas du random
			if (mode.equals("random")){
				int nbSommets, intervalleMin, intervalleMax;
				float prob ;
				Graphe g ;
				Matcher mIntervalle ;
				Pattern p ;
				String intervalle ;
				
				//test sur les paramètres de à random 
				if (argv.length != 4 ){
					usage();
					throw new Exception("Nombre d'argument(s) invalide !");
				}

				// Récupération des arguments passé en paramètre
				nbSommets = Integer.parseInt(argv[1]);
				prob = Float.parseFloat(argv[2]);
				intervalle = argv[3];
				
				// Vérification de la probabilité
				if (prob<0 || prob>1) {
					System.err.println("La probabilité doit être comprise entre 0 et 1 inclus !");
					usage();
				}

				
				//puis 
				p = Pattern.compile("(\\d+)-(\\d+)");
				mIntervalle = p.matcher(intervalle);

				if(mIntervalle.matches()){
					//récupération de notre intervalle en deux variable
					intervalleMin = Integer.parseInt(mIntervalle.group(1));

					intervalleMax = Integer.parseInt(mIntervalle.group(2));
					//appel au constructeur de graphe aléatoire
					
					g = new Graphe(nbSommets, prob, intervalleMin, intervalleMax);
					
					Graphe g2 = g.connexe();
					int tailleCC = g2.getV().size();
					
					Graphe g3 = g2.prim();

					System.err.print("Le graphe de départ est ");
					if(g.isConnexe()) System.err.println("connexe.");
					else System.err.println("non connexe.");
					System.err.println("Taille de la Composante Connexe : "+tailleCC);
					System.err.println("Poids de l'Arbre Couvrant : "+g3.getPoids());
					System.err.println("Arbre couvrant : ");
					System.err.println(g3);
					System.out.println("Graphe initial : ");
					System.out.println(g);
				} 
				else {
					System.err.println("L'intervalle ne respecte pas la forme [nb-nb].");
					usage();
				}
			}
			// Cas du file
			else if(mode.equals("file")) {
				String nomFichier = argv[1];
				
				Graphe g = new Graphe(nomFichier);

				Graphe g2 = g.connexe();
				int tailleCC = g2.getV().size();
				
				Graphe g3 = g2.prim();
				
				System.err.print("Le graphe de départ est ");
				if(g.isConnexe()) System.err.println("connexe.");
				else System.err.println("non connexe.");
				System.err.println("Taille de la Composante Connexe : "+tailleCC);
				System.err.println("Poids de l'Arbre Couvrant : "+g3.getPoids());
				System.err.println("Arbre couvrant : ");
				System.err.println(g3);
				System.out.println("Graphe initial : ");
				System.out.println(g);
			}
			// Cas de l'usage
			else if(mode.equals("usage")) {
				usage();
			}
			// Exception
			else {
				throw new Exception("Le premier argument est invalide !");
			}
		}
	} // Fin de la fonction main
} // Fin de la classe Main